package ThreadPool;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class Test {
    public static void main(String[] args) {
        //创建了一个线程池,池子里的线程固定是10个,像newFixedThreadPool这样的方法叫做工厂方法,Executors叫做工厂类
        //这个代码使用了工厂模式的设计模式
        ExecutorService pool = Executors.newFixedThreadPool(10);
        //这个hello不是被主线程执行,而是被线程池的某一个线程执行
        for (int i = 0; i < 1000; i++) {
            /** 变量捕获  : 此处i是修改的 不能捕获,而n没有修改,虽然没有加final,但是也可以捕获
             *  为了避免作用域的差异,导致后续执行run的时候,i已经销毁,于是就有了变量捕获,也就是
             *  让run方法把刚才在主线程的i给往当前run的栈上拷贝了一份
             *  就是用一个不变的值将i记录下来,之后在执行到这个run的时候,会使用这个值,以防i销毁后,找不到该值了
             *  i的生命周期是在主线程的,而run的生命周期是在线程之外的
             */

            int n = i;
            //进一步可以认为,这1000个任务,都在一个队列里排队,这10个线程依次来取队列中的任务,取一个就执行一个,执行完就执行下一个
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello " + n);
                }
            });
        }
    }
}
